/*
  1：下载axios
  2:导入axios
  3:创建axios副本 axios.create({baseURL:基地址,timeout:5000})
  4:加入请求拦截与响应拦截
  5：暴露出去
  6:src/api/模块名.js
     导入与定义api
  7:页面导入api方法使用

环境变量
  开发环境
     根目录创建  .env.development  文件
     定义环境变量
          以 VUE_APP_ 开头
          比如： VUE_APP_XXX='123'
      访问：process.env.VUE_APP_XXX

  生产环境
     根目录创建  .env.production  文件
     定义环境变量
          以 VUE_APP_ 开头
          比如： VUE_APP_XXX='123'
      访问：process.env.VUE_APP_XXX

  自定义环境
      根目录创建  .env.xxx  文件
      定义环境变量
          以 VUE_APP_ 开头
          比如： VUE_APP_XXX='123'
      访问：process.env.VUE_APP_XXX
      修改package.json 内的scripts
      "build:xxx": "vue-cli-service build --mode xxx",

*/

import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router' // router===this.$router
// 用代码识别到是开发环境使用开发基地址
// console.log('当前环境', process.env.NODE_ENV)
const request = axios.create({
  // baseURL:
  //   process.env.NODE_ENV === 'development'
  //     ? 'http://localhost:3000/api'
  //     : 'http://ihrm-java.itheima.net/api' // 本地接口
  baseURL: process.env.VUE_APP_URL,
  withCredentials: true // 跨域带cookie   允许头
  // baseURL: 'http://ihrm-java.itheima.net/api' // 本地接口
  // baseURL:"http://服务器ip地址:3000/api",  // 自己的服务器接口
  // baseURL:"http://119.91.150.211:3000/api",  // 在线接口
})
let cancelArr = []
export const cancelAll = () => {
  cancelArr = cancelArr.filter((item) => {
    item.fn()
    return false
  })
}
request.interceptors.request.use(
  (config) => {
    // 统一token处理
    // 1：接口不需要token加了直接报错
    // console.log('config', config)
    // if (!config.noToken) {
    //   config.headers.Authorization = `Bearer ${store.state.user.token}`
    // }
    // 2：接口不需要token加了没关系
    config.headers.Authorization = `Bearer ${store.state.user.token}`

    // 取消同一接口上一次请求
    cancelArr = cancelArr.filter((item) => {
      if (item.url === config.url && item.method === config.method) {
        item.fn()
        return false
      }
      return true
    })

    // 记录所有接口的取消方法
    if (!config.noCancel) {
      config.cancelToken = new axios.CancelToken((cancelFn) => {
        cancelArr.push({
          url: config.url,
          method: config.method,
          fn: cancelFn
        })
      })
    }
    return config
  },
  (error) => {
    // return new Promise((resolve,reject)=>{
    //   reject(error)
    // })

    return Promise.reject(error)
  }
)
request.interceptors.response.use(
  (res) => {
    if (res.data.success) {
      return res.data
    } else {
      // 提示
      Message.error(res.data.message)
      // return new Promise((resolve, reject) => {
      //   reject('错误')
      // })
      // eslint 严格一点的一定要在reject上加入new Error
      // 抛出了一个错误，中止.then执行，执行.catch
      return Promise.reject(new Error(res.data.message))
    }
  },
  (error) => {
    /*
      token失效
        判断token失效的条件
            1：清除token
            2:清除用户信息
            3：提示
            4：跳转到登录页
    */
    if (error.response && error.response.status === 401) {
      // 1：清除token
      // 2:清除用户信息
      store.commit('user/logout')
      // 3：提示
      Message.error(error.response.data.message)
      // 4：跳转到登录页
      router.push('/login')
    }
    // console.dir(error)
    return Promise.reject(error)
  }
)
export default request
